home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / MYMUD21.ZIP / MMUD21.ZIP / SOURCE / SOURCE.ZIP / NICELINE.PAS < prev    next >
Pascal/Delphi Source File  |  1995-01-21  |  6KB  |  235 lines

  1. {$I COPYRGHT.INC}
  2.  
  3. (*---------------------------------------------------------------------------*
  4.    This unit contains the nice line-editor
  5.  *---------------------------------------------------------------------------*)
  6.  
  7. Unit NiceLine;
  8. Interface
  9. Uses Dos,
  10.      Bin_DB,
  11.      Header,
  12.      Multi,
  13.      KeyDefs,
  14.      MyIO,
  15.      Timer;
  16.  
  17. Const BufferSize = $10;
  18.  
  19. Type Status = (Ready_Status,TimeOut_Status);
  20.  
  21.  
  22. Function LineEditor(     Prompt : String;
  23.                      Var Line   : String;
  24.                          MaxLen : Byte;
  25.                          Time   : Word):Status;
  26.  
  27.  
  28. Implementation
  29.  
  30. Procedure Cursor_On;
  31. Var regs : Registers;
  32. Begin
  33. Regs.Ah:=$01;
  34. Regs.Ch:=$06;
  35. Regs.Cl:=$07;
  36. Intr($10,Regs);
  37. End;
  38.  
  39. Procedure Cursor_Off;
  40. Var regs : Registers;
  41. Begin
  42. Regs.Ah:=$01;
  43. Regs.Ch:=$16;
  44. Regs.Cl:=$0;
  45. Intr($10,Regs);
  46. End;
  47.  
  48. Procedure Cursor_Half;
  49. Var regs : Registers;
  50. Begin
  51. Regs.Ah:=$01;
  52. Regs.Ch:=$04;
  53. Regs.Cl:=$07;
  54. Intr($10,Regs);
  55. End;
  56.  
  57. Type KeyBoardBuffer = Array[0..BufferSize-1] of String[80];
  58.  
  59. Var  KBBuf    : KeyBoardBuffer;
  60.      KBPtr    : Byte;
  61.      OldKB    : Byte;
  62.  
  63.  
  64. Var Cursor      : Byte;
  65.     Ins         : Boolean;
  66.     Continue    : Boolean;
  67.  
  68. Function LineEditor(     Prompt : String;
  69.                      Var Line   : String;
  70.                          MaxLen : Byte;
  71.                          Time   : Word):Status;
  72.  
  73. Var Len         : Byte;
  74.     Stop        : Boolean;
  75.     GotKey      : Boolean;
  76.     Key         : Char;
  77.     Ext         : Boolean;
  78.     OldCursor   : Byte;
  79.     TimeOut     : TimerObject;
  80.  
  81. Procedure Show(Prompt,Line : String; Cursor,MaxLen : Byte);
  82. Var MemX : Byte;
  83. Begin
  84. Cursor_Off;
  85. If Length(Line)>MaxLen
  86.    Then Line[0]:=Chr(MaxLen);
  87.  
  88. My_Write(#13+Prompt);
  89. MemX:=My_WhereX-1;
  90. My_Write(Line);
  91.  
  92. My_ClrEol;
  93. My_GotoXy(MemX+Cursor,My_WhereY);
  94. If Ins
  95.    Then Cursor_On
  96.    Else Cursor_Half;
  97. End;
  98.  
  99.  
  100. Begin
  101. If Not Continue
  102.    Then Begin
  103.         Cursor:=1;
  104.         Ins:=True;
  105.         End;
  106. Continue:=False;
  107. Len:=Length(Line);
  108. Stop:=False;
  109. OldKB:=KBPtr;
  110. If Time=0
  111.    Then Time:=MaxInt;
  112. TimeOut.SetTimer(Time);
  113.  
  114. Repeat
  115.   Show(Prompt,Line,Cursor,MaxLen);
  116.   Repeat
  117.    Ext:=True;
  118.    GotKey:=False;
  119.    If My_KeyPressed
  120.       Then Begin
  121.            Key:=My_ReadKey;
  122.            If Key=#00
  123.               Then Key:=My_ReadKey
  124.               Else Ext:=False;
  125.            GotKey:=True;
  126.            End;
  127.     If TimeOut.TimeUp
  128.        Then Begin
  129.             LineEditor:=TimeOut_Status;
  130.             Continue:=True;
  131.             Exit;
  132.             End;
  133.   Until GotKey;
  134.  
  135.   Case Ext Of
  136.     False : Begin
  137.             Case Key Of
  138.              #13 : Begin
  139.                    LineEditor:=Ready_Status;
  140.                    Stop:=True;
  141.                    KBPtr:=OldKB;
  142.                    KBBuf[KBPtr]:=Line;
  143.                    KBPtr:=(KbPtr+1) Mod BufferSize;
  144.                    End;
  145.              ^Y,
  146.              #27 : Begin
  147.                    Line:='';
  148.                    Cursor:=1;
  149.                    Len:=0;
  150.                    End;
  151.              #8  : Begin
  152.                    If Cursor>1
  153.                       Then Begin
  154.                            Delete(Line,Cursor-1,1);
  155.                            Dec(Cursor);
  156.                            End;
  157.  
  158.                    End;
  159.              Else  Begin
  160.                    If Length(Line)<MaxLen
  161.                       Then Begin
  162.                            If Cursor>Length(Line)
  163.                               Then Line:=Line+Key
  164.                               Else Begin
  165.                                    If Ins
  166.                                       Then Insert(Key,Line,Cursor)
  167.                                       Else Line[Cursor]:=Key;
  168.                                    End;
  169.                            Inc(Cursor);
  170.                            End;
  171.                    End;
  172.             End; {Case}
  173.             End;
  174.  
  175.     True  : Begin
  176.             Case Key Of
  177.              InsK     : Ins:=Not Ins;
  178.              DelK     : Begin
  179.                         If Cursor<Length(Line)
  180.                            Then Delete(Line,Cursor,1);
  181.                         End;
  182.              EndK     : Cursor:=Length(Line)+1;
  183.              HomeK    : Cursor:=1;
  184.              CEndK    : Line[0]:=Chr(Cursor-1);
  185.              F3       : Begin
  186.                         KBPtr:=(OldKB+(BufferSize-1)) Mod BufferSize;
  187.                         Line:=KBBuf[KBPtr];
  188.                         Cursor:=Length(Line)+1;
  189.                         End;
  190.              ArrUp    : Begin
  191.                         KBPtr:=(KBPtr+(BufferSize-1)) Mod BufferSize;
  192.                         Line:=KBBuf[KBPtr];
  193.                         Cursor:=Length(Line)+1;
  194.                         End;
  195.              ArrDn    : Begin
  196.                         KBPtr:=(KBPtr+1) Mod BufferSize;
  197.                         Line:=KBBuf[KBPtr];
  198.                         Cursor:=Length(Line)+1;
  199.                         End;
  200.              ArrLft   : If Cursor>1 Then Dec(Cursor);
  201.              ArrRt    : If Cursor<(Length(Line)+1) Then Inc(Cursor);
  202.              CArrLft  : Begin
  203.                         If Cursor>1
  204.                            Then Begin
  205.                                 Dec(Cursor);
  206.                                 While (Cursor>1) And (Line[Cursor-1]<>' ') Do
  207.                                   Dec(Cursor);
  208.                                 End;
  209.                         End;
  210.              CArrRt   : Begin
  211.                         If Cursor<Length(Line)
  212.                            Then Begin
  213.                                 Inc(Cursor);
  214.                                 While (Cursor<(Length(Line)+1)) And (Line[Cursor-1]<>' ') Do
  215.                                   Inc(Cursor);
  216.                                 End;
  217.                         End;
  218.             End;
  219.             End;
  220.   End; {Case}
  221. Until Stop;
  222. Show(Prompt,Line,Cursor,MaxLen);
  223. My_WriteLn('');
  224. Cursor_On;
  225. End;
  226.  
  227. Begin
  228. Fillchar(KBBuf,SizeOf(KBBuf),#00);
  229. KBPtr:=0;
  230. OldKB:=0;
  231. Cursor:=0;
  232. Continue:=False;
  233. Ins:=True;
  234. End.
  235.